namespace ConsoleApp3._1020;

public class Student
{
    
    // 私有字段（封装数据，通过属性暴露）
    private string _studentId;  // 学号
    private string _name;       // 姓名
    private int _age;           // 年龄
    private double _score;      // 成绩（0-100）


    // 构造方法1：无参构造（默认初始化）
    public Student()
    {
        _studentId = "未知";
        _name = "未知";
        _age = 0;
        _score = 0;
    }

    // 构造方法2：带参数构造（直接初始化核心属性）
    public Student(string studentId, string name, int age, double score)
    {
        StudentId = studentId;  // 利用属性的setter进行验证
        Name = name;
        Age = age;
        Score = score;
    }


    // 公共属性（提供get/set访问，同时包含数据验证）
    /// <summary>
    /// 学号（非空验证）
    /// </summary>
    public string StudentId
    {
        get => _studentId;
        set
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("学号不能为空或空白！");
            _studentId = value;
        }
    }

    /// <summary>
    /// 姓名（非空验证）
    /// </summary>
    public string Name
    {
        get => _name;
        set
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("姓名不能为空或空白！");
            _name = value;
        }
    }

    /// <summary>
    /// 年龄（1-150岁范围验证）
    /// </summary>
    public int Age
    {
        get => _age;
        set
        {
            if (value < 1 || value > 150)
                throw new ArgumentOutOfRangeException("年龄必须在1-150之间！");
            _age = value;
        }
    }

    /// <summary>
    /// 成绩（0-100分范围验证）
    /// </summary>
    public double Score
    {
        get => _score;
        set
        {
            if (value < 0 || value > 100)
                throw new ArgumentOutOfRangeException("成绩必须在0-100之间！");
            _score = value;
        }
    }


    // 方法：展示学生完整信息
    public void ShowInfo()
    {
        Console.WriteLine($"===== 学生信息 =====");
        Console.WriteLine($"学号：{StudentId}");
        Console.WriteLine($"姓名：{Name}");
        Console.WriteLine($"年龄：{Age}岁");
        Console.WriteLine($"成绩：{Score}分");
        Console.WriteLine($"等级：{GetGrade()}");  // 调用等级判断方法
        Console.WriteLine("====================");
    }

    // 方法：根据成绩返回等级（A/B/C/D/E）
    private string GetGrade()
    {
        if (Score >= 90) return "A（优秀）";
        if (Score >= 80) return "B（良好）";
        if (Score >= 60) return "C（及格）";
        if (Score >= 40) return "D（待及格）";
        return "E（不及格）";
    }
}

/* class Program
{
    static void Main(string[] args)
    {
        try
        {
            // 1. 通过无参构造创建学生对象，再赋值
            Student student1 = new Student();
            student1.StudentId = "2023001";
            student1.Name = "张三";
            student1.Age = 18;
            student1.Score = 85;
            student1.ShowInfo();  // 展示信息


            // 2. 通过带参构造直接创建学生对象
            Student student2 = new Student("2023002", "李四", 19, 92);
            student2.ShowInfo();


            // 3. 测试验证逻辑（故意传入无效值，会抛出异常）
            // Student student3 = new Student("", "王五", 200, 150); 
            // 上面代码会抛出异常：学号不能为空 / 年龄超出范围 / 成绩超出范围
        }
        catch (Exception ex)
        {
            Console.WriteLine("错误：" + ex.Message);
        }
    }
}
*/